package org.jeecg.modules.power.device.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.app.v1.device.entity.*;
import org.jeecg.modules.app.v1.shop.entity.ApiAddShopEntity;
import org.jeecg.modules.power.device.entity.YlDevice;
import org.jeecg.modules.power.device.entity.YlDeviceRecords;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.power.device.entity.YlEmptyShopRecords;
import org.jeecg.modules.power.group.entity.GroupUser;
import org.jeecg.modules.power.shop.entity.YlShop;
import org.jeecg.modules.system.entity.SysUser;

import java.util.List;

/**
 * @Description: 设备变动记录表
 * @Author: jeecg-boot
 * @Date:   2024-07-17
 * @Version: V1.0
 */
public interface IYlDeviceRecordsService extends IService<YlDeviceRecords> {

    /**-----------------------------------------后台使用----------------------------------------------------------------------------------*/

    /**
     * 后台审核设备转移
     * @param records
     */
    void check(YlDeviceRecords records);
    /**
     * 后台管理员进行调拨
     */
    void transfer(YlDevice device);

    /**
     * 新增无设备门店
     * @param shopId
     * @param unbindTime
     * @param unbindDate
     */
    void saveEmptyShopRecords(String shopId,String unbindTime,String unbindDate);

    /**
     * 删除无设备门店记录
     * 门店7天内绑定设备，删除记录
     * @param shopId
     */
    void deleteEmptyShop(String shopId);

    /**
     * 无绑定设备门店（包含解绑设备门店和从公海认领门店）
     * 用于每天刷新处理超7天未绑定设备自动进入公海业务
     * @return
     */
    List<YlEmptyShopRecords>emptyShopList();
    /**-----------------------------------------后台使用----------------------------------------------------------------------------------*/


    /**-----------------------------------------接口使用----------------------------------------------------------------------------------*/

    /**
     * 资产一览-故障设备列表
     * @param page
     * @param categoryId
     * @param mac
     * @param groupId 权限数据查询
     * @param flag {@link org.jeecg.modules.app.v1.util.Const.sourceType_1}
     * @return
     */
    IPage<ApiFaultDeviceEntity> faultDeviceList(Page<ApiFaultDeviceEntity> page, String mac, String categoryId, String flag, String groupId,String sourceType,String status);
    /**
     * 门店下设备解绑绑定记录
     * @param page
     * @param shopId
     * @param beginTime
     * @param endTIme
     * @return
     */
    IPage<ApiBindDeviceEntity> shopBindDevice(Page<ApiBindDeviceEntity> page, String shopId, String beginTime, String endTime);
    /**
     * 校验设备是否可退库
     * @param deviceNo
     * @param bdId
     * @return
     */
    JSONObject getDevice(String deviceNo, String bdId);
    /**
     * 校验设备是否可退库
     * @param deviceNo
     * @param bdId
     * @return
     */
    JSONObject getNewDevice(String deviceNo, String bdId);
    /**
     * 设备退库申请记录（包含异常退库）
     * @param page
     * @param transferNumber
     * @param beginTime
     * @param endTime
     * @param deviceCategory
     * @param transferType
     * @return
     */
    List<ApiStockDeviceRecordEntity> getDeviceRecords(Page<ApiStockDeviceRecordEntity> page,
                                                             String transferId,
                                                             String transferNumber,
                                                             String beginTime,
                                                             String endTime,
                                                             String deviceCategory, String transferType);
    /**
     * 新增门店，针对需要审核的情况的，对设备加锁，防止其他操作。
     * @param deviceList
     * @param lockId
     */
    void lockDevice(List<ApiAddShopEntity.DeviceInfo> deviceList,String lockId);
    /**
     * 新增门店审核通过后，针对加锁设备进行解锁处理
     * @param deviceList
     * @param lockId
     */
    void unlockDevice(List<ApiAddShopEntity.DeviceInfo> deviceList,String lockId);
    /**
     * 设备解绑申请单
     * @param page
     * @param transferStatus
     * @param transferNumber
     * @return
     */
    IPage<ApiUnbindDeviceEntity> unbindDeviceList(Page<ApiUnbindDeviceEntity> page, String transferStatus, String transferNumber,String receiveId);

    /**
     * 设备解绑绑定记录
     * @param page
     * @param deviceId
     * @return
     */
    IPage<ApiBindDeviceEntity> bindDeviceList(Page<ApiBindDeviceEntity> page, String deviceId);
    /**
     * bd间资产转移列表
     * @param page
     * @param transferId
     * @param receiveId
     * @param transferNumber
     * @return
     */
    IPage<ApiBindDeviceEntity> bdDeviceList(Page<ApiBindDeviceEntity> page, String transferId, String receiveId,String transferNumber);
    /**
     * 设备入库
     * @param device
     */
    void saveDevice(YlDevice device);

    /**
     * 故障报修退库申请
     * @param deviceMac
     * @param storeId
     * @param bd
     */
    void stock(String deviceMac,String storeId, SysUser bd,String type);
    /**
     * 退库申请
     * @param deviceMac
     * @param storeId
     * @param bd
     */
    void storage(String deviceMac,String storeId, SysUser bd,String type);
    /**
     * 资产转移
     * @param deviceMac 多个设备以,隔开
     * @param userBd 接收方bdId
     * @param user 转出方bd
     */
    void transfer(String deviceMac,GroupUser userBd, GroupUser user);
    /**
     * 资产转移确认
     * @param id 多个设备以,隔开
     * @param status 是否接收 2接收3拒绝
     * @param remark 不接收理由
     */
    void confirm(String id, Integer status, String remark);
    /**
     * 设备解绑申请单
     * @param page
     * @param status
     * @return
     */
    IPage<YlDeviceRecords> getUnbindList(Page<YlDeviceRecords> page,
                                         Integer status,
                                         String bdId,
                                         String deviceMac,
                                         String transferNumber);
    /**
     * 解绑，设备由 门店->BD
     * 转出方为门店，接收方为BD
     * @param deviceSn
     * @param bd
     */
    void unbind(String deviceSn, SysUser bd, YlShop shop);
    /**
     * 绑定，设备由 BD->门店
     * 转出方为BD，接收方为门店
     * @param List<DeviceInfo> device
     * @param bd
     */
    Result<?> bind(List<ApiAddShopEntity.DeviceInfo> device, YlShop shop, SysUser bd,String remark);
    /**
     * 门店绑定设备
     * @param apiBindDevice
     * @param bd
     */
    void bindDevice(ApiBindDevice apiBindDevice, YlShop shop,SysUser bd);
    /**
     * 门店设备绑定解绑记录
     * @param pagge
     * @param shopId
     * @return
     */
    IPage<YlDeviceRecords> shopDeviceList(Page<YlDeviceRecords> pagge, String shopId);
    /**
     * 统计门店下设备数量
     * @param shopId
     * @return
     */
    int countShopDevice(String shopId);



    /**-----------------------------------------接口使用----------------------------------------------------------------------------------*/

    /**
     * 拿到GroupUser 信息
     * @param userId
     * @return
     */
    GroupUser getGroupUser(String userId);
}
